import { observer } from "./observe/index";
export function initState(vm) {
  let opts = vm.$options;

  //判断
  if (opts.props) {
    initProps(vm);
  }
  if (opts.data) {
    initData(vm);
  }
  if (opts.computed) {
    initComputed(vm);
  }
  if (opts.watch) {
    initWatch(vm);
  }
  if (opts.methods) {
    initMethods(vm);
  }

}

function initProps(vm) {
}

function initComputed(vm) {

}
function initMethods(vm) {

}
function initWatch(vm) {

}

//对data初始化 判断是对象还是函数
function initData(vm) {
  // console.log('对data初始化');
  let data = vm.$options.data;
  vm._data = data = typeof data === 'function' ? data.call(vm) : data;  //注意this指向问题
  // console.log('vm._data', vm._data);
  //data进行数据劫持 （1）对象 （2）数组
  //将data上的所有属性代理到实例上vm {a:1,b:2},这也就是我们为什么在使用的时候可以直接使用this.msg用法
  for (let key in data) {
    proxy(vm, '_data', key)
  }

  observer(data);
}

function proxy(vm, source, key) {
  Object.defineProperty(vm, key, {
    get() {
      return vm[source][key]
    },
    set(newValue) {
      vm[source][key] = newValue
    }
  })
}